import os
import time

import allure

import pytest
import sys

from jsonpath import jsonpath
from common.db import sqlserver_query,sqlserver_update
from common.logger import Logger
from common.read_yaml import ReadYaml_By_Root_Dict
sys.path.append("..")
from api import login_api
data = ReadYaml_By_Root_Dict("configs/environment_var.yml").get_yaml_data()  # 读取数据

# -----------------------------登录以及初始化环境--------------------------------------------

# 用于pytest运行时构造命令行参数
def pytest_addoption(parser):
    """
    增加参数env
    :param parser:
    :return:
    """
    parser.addoption("--env", action="store", default="single",
                     help="将命令行参数 ’--env' 添加到 pytest 配置中，执行环境")
    parser.addoption("--restore", action="store", default="N",
                     help="将命令行参数 ’--restore' 添加到 pytest 配置中，是否还原数据库，默认为N")

# 执行环境的切换
@pytest.fixture(scope='session',autouse=True)
def set_env(request):
    """
    如何获取环境参数进行切换：
    一、命令行传入 pytest --env single test.py
    二、通过pytest.ini传入： addopts = --env single
    三、通过pycharm运行时的additional arugemnts传入
    :param request:
    :return:
    """

    # conftest.py作用于case文件夹下，如果用变量接收环境信息，case文件夹外的文件引用不到该变量
    os.environ["api_test_env"] = request.config.getoption("--env")
    os.environ["restore"] = request.config.getoption("--restore")
    Logger.info(f'当前用例运行测试环境:{os.environ["api_test_env"]}')
    # 只有单机环境，且restore为Y，还原数据库快照。
    if os.environ["api_test_env"] == 'single' and os.environ["restore"] == 'Y':
        command = 'call ./configs/resource/RestoreDB_ClearCache.bat'
        os.system(command)
        for i in range(5):
            print(f'等待{5 - i}秒后再执行用例')
            time.sleep(1)

@pytest.fixture(scope="function")
@allure.step("指定用户登录")
def user_login():
    return login_api.Login()

# 冒烟环境初始化用户
def init_user(username,usercode):
    OrgM = login_api.Login().goto_Organization_Management('admin')
    body = {
        'code':usercode,
        'name':username,
        'pwd':'1',
        'phone':'',
        'email':'',
        'is_sys_admin':'1',
        'is_disabled':'0',
        'orgs[0][org_id]':'11B11DB4-E907-4F1F-8835-B9DAAB6E1F23',
        'orgs[0][is_default]':'1'
    }
    resp = OrgM.create_user(body)
    code = jsonpath(resp.json(),'$.code')[0]
    message = jsonpath(resp.json(),'$.message')[0]
    if code == 1:
        Logger.info(f'【{username}】创建成功')
    else:
        Logger.info(f'【{username}】创建失败：{message}')

# 初始化基础数据，用于各个冒烟环境的数据准备
@pytest.fixture(scope="session")
def init_environment():
    # 获取yml文件中user的数据参数
    users = data[os.environ["api_test_env"]]['smoke_user']
    for user in users:
        username, usercode, userguid= user['name'],user['code'],user['id']
        # 初始化需要的用户
        print(f'初始化用户：{username, usercode, userguid}')
        init_user(username,usercode)
        # 将所需的用户id改为统一，方便导入的模板能识别到用户
        old_id = sqlserver_query(f"SELECT id FROM dbo.p_user WITH(NOLOCK) WHERE code='{usercode}'")[0][0]
        # 更新用户id和组织下的用户id
        sqlserver_update(f"UPDATE p_user SET id='{userguid}' WHERE code='{usercode}';UPDATE dbo.p_user2organization SET user_id='{userguid}' WHERE user_id='{old_id}'")

# ids显示中文
def pytest_collection_modifyitems(session, config, items):
    for item in items:
        item.name = item.name.encode("utf-8").decode("unicode-escape")
        item._nodeid = item.nodeid.encode("utf-8").decode("unicode-escape")

